import sdk from 'redcatSdk'

// 判断是否为 prod
export const isProd = process.env.NODE_ENV === 'production'

/**
 * 遍历拿到的文件
 * @param {Object}} files 需要遍历的文件
 * @param {Function} callback 遍历回调
 */
const traverseFile = (files, callback) => {
  const requireAll = components => components.keys().map(item => {
    return {
      file: components(item),
      fileName: item?.replace?.('./', '')
    }
  })
  requireAll(files).forEach(component => callback(component))
}

/**
 * 批量导入js文件
 * @param {Object} files 需要处理的文件列表
 * @param {String} fileType 表单/流程/报表
 */
export const importJsFile = (files, fileType) => {
  let define = {}
  traverseFile(files, ({file, fileName}) => {
    const component = file?.default
    const type = typeof component
    if (component && type === 'function' || type === 'object') {
      let defineItem = {}
      // 判断当前 component 是否为 object 还是 function
      // 如果是方法，解析方法获取返回值
      // 注意：方法当前只提供了一个参数为 sdk，可以自定义其他参数
      defineItem = type === 'function' ? component(sdk) : component
      // 如果有文件中的id重复，抛出异常提示
      Object.keys(defineItem).forEach(key => {
        if (define.hasOwnProperty(key)) {
          const errorMsg = `${fileType}文件 ${fileName} id重复: ${key}`
          !isProd && sdk.message.error(errorMsg)
          throw new Error(errorMsg)
        }
      })
      // 过滤空object
      Object.keys(defineItem).length > 0 && Object.assign(define, defineItem)
    } else {
      const errorMsg = `${fileName}文件解析失败，请检查导出格式是否为 Object 或者 Function`
      !isProd && sdk.message.error(errorMsg)
      throw new Error(errorMsg)
    }
  })
  return define
}
